package com.adb.util;

import android.util.Log;

import com.adb.entity.DataRect;
import com.jjmmbb.jxSudoku.GameActivity;

public class GameCheck {
	GameActivity father;

	public GameCheck(GameActivity father) {
		this.father = father;
	}

	// 完成冲突
	public boolean checkFinish() {
		int[] data_check = new int[81];
		for (DataRect dr : GameActivity.rects) {
			if (dr.getData() == 0) {
				return false;
			}
			data_check[dr.getNumber()] = dr.getData();
		}
		for (int i = 0; i < 9; i++) {
			int sum_h = 0;
			int sum_v = 0;
			for (int j = 0; j < 9; j++) {
				int k = i * 9 + j;
				int l = j * 9 + i;
				sum_h += data_check[k];
				sum_v += data_check[l];
			}
			// 最简单的判断 能应付99%的情况
			// 行相加==99 ;列相加==99
			if (sum_h != 45 || sum_v != 45) {
				return false;
			}
		}
		return true;
		// 还没做全面的判断
	}

	// 冲突检查 目前只检查行列,并标记冲突的方格
	public boolean checkClash() {
		boolean flag = true;
		if (null == GameActivity.rects) {
			return false;
		}

		int[] data_check = new int[81];
		for (DataRect dr : GameActivity.rects) {
			// if (dr.getType() >= 10) {
			// dr.setType(dr.getType() - 10); // 初始化不冲突
			// }
			dr.isAttack = false;
			data_check[dr.getNumber()] = dr.getData();
		}

		for (int k = 0; k < 81; k++) {
			if (data_check[k] == 0) {
				continue;
			}
			int r = k / 9; // 行号
			int c = k % 9; // 列号
			// 检查当前行后面是否有冲突
			for (int i = c + 1; i < 9; i++) {
				int l = r * 9 + i;
				if (data_check[l] == data_check[k]) {
					drawClash(l, k);
					flag = false;
				}
			}
			// 检查当前列以下是否有冲突
			for (int i = r + 1; i < 9; i++) {
				int l = i * 9 + c;
				if (data_check[l] == data_check[k]) {
					drawClash(l, k);
					flag = false;
				}
			}
		}

		return flag;
	}

	// 冲突检查 目前只检查行列,并标记冲突的方格
	public boolean checkClash2() {
		boolean flag = true;
		if (null == GameActivity.rects) {
			return false;
		}
		for (int i = 0; i < 81; i++) {
			 GameActivity.rects.get(i).isAttack = false; //初始化为不冲突
		}
		for (int i = 0; i < 81; i++) {
			DataRect dr = GameActivity.rects.get(i);
			for (int k = i + 1; k < 81; k++) {
				DataRect tmp = GameActivity.rects.get(k);
				// 如果值相等,检查冲突
				if (dr.getData() == tmp.getData()) {
					// 是否在相同的行或列
					if (dr.r == tmp.r || dr.l == tmp.l) {
						drawClash2(dr, tmp);// 标记为冲突
						continue;
					}
					// 是否在相同的九宫格
					if (isIn9Rec(dr, tmp)) {
						drawClash2(dr, tmp);// 标记为冲突
						continue;
					}
				}
			}
		}

		return flag;
	}

	// 标记冲突的方格
	private void drawClash2(DataRect dr1, DataRect dr2) {
		dr1.isAttack = true;
		dr2.isAttack = true;
		if (dr1.getType() == 5) {
			// 如果是刚刚填下的数字,将他修改为[选中,可编辑]
			dr1.setType(3); // 设置为当前方格
		}
		if (dr2.getType() == 5) {
			// 如果是刚刚填下的数字,将他修改为[选中,可编辑]
			dr2.setType(3); // 设置为当前方格
		}
	}

	// 九宫格校验
	private boolean isIn9Rec(DataRect dr1, DataRect dr2) {
		int fh1 = ((int) (dr1.r / 3)) * 3;// 当前九宫格的第一格的行号
		int fl1 = ((int) (dr1.l / 3)) * 3;// 当前九宫格的第一格的列号
		int fh2 = ((int) (dr2.r / 3)) * 3;
		int fl2 = ((int) (dr2.l / 3)) * 3;

		if (fh1 == fh2 && fl1 == fl2) {
			return true;
		}
		return false;
	}

	// 标记冲突的方格
	private void drawClash(int l, int k) {
		for (DataRect dr : GameActivity.rects) {
			if (dr.getNumber() == l || dr.getNumber() == k) {
				// if (dr.getType() == 3) {
				// continue; // 如果为当前方格,则跳过
				// }
				// if (dr.getType() >= 10) {
				// continue; // 防止重复累加
				// }
				dr.isAttack = true;
				if (dr.getType() == 5) {
					// 如果是刚刚填下的数字,将他修改为[选中,可编辑]
					dr.setType(3); // 设置为当前方格
				}
				// dr.setType(dr.getType() + 10);
			}
		}
	}

	// 检查自动填入
	public boolean autoFill(DataRect checkDr) {
		if (checkDr.getData() != 0)
			return false; // 已经有数字了,不自动填充,无效双击
		int[] data_check = new int[81];
		for (DataRect dr : GameActivity.rects) {
			data_check[dr.getNumber()] = dr.getData();
		}

		int k = checkDr.getNumber();
		int h = k / 9;
		int l = k % 9;

		int auto = 0;
		int flags[] = new int[10];
		// 行校验
		for (int i = 0; i < 9; i++) {
			int b = data_check[h * 9 + i];
			flags[b]++;
		}
		for (int i = 0; i < 10; i++) {
			if (flags[i] > 1) {
				auto = 0;
				break;
			}
			if (flags[i] == 0) {
				auto = i;
			}
		}
		if (auto != 0) {
			autoFillMethod(checkDr, auto);// 已经找到
			return true;
		}

		// 列校验
		auto = 0;
		flags = new int[10];
		for (int i = 0; i < 9; i++) {
			int c = data_check[i * 9 + l];
			flags[c]++;
		}
		for (int i = 0; i < 10; i++) {
			if (flags[i] > 1) {
				auto = 0;
				break;
			}
			if (flags[i] == 0) {
				auto = i;
			}
		}
		if (auto != 0) {
			autoFillMethod(checkDr, auto);// 已经找到
			return true;
		}

		// 九宫格校验
		auto = 0;
		flags = new int[10];
		int fh, fl;// 九宫格第一个数字的行列号
		fh = ((int) (h / 3)) * 3;
		fl = ((int) (l / 3)) * 3;
		for (int r = fh; r < fh + 3; r++) {
			for (int c = fl; c < fl + 3; c++) {
				int d = data_check[r * 9 + c];
				flags[d]++;
			}
		}

		for (int i = 0; i < 10; i++) {
			if (flags[i] > 1) {
				auto = 0;
				break;
			}
			if (flags[i] == 0) {
				auto = i;
			}
		}
		if (auto != 0) {
			autoFillMethod(checkDr, auto);// 已经找到
			return true;
		}

		Log.d("main", "autocheck:no find! ");
		return false;
	}

	// 填充一个方格
	private void autoFillMethod(DataRect checkDr, int auto) {
		checkDr.setData(auto); // 已经找到
		GameActivity.currentNumber = auto;
		// GameActivity.currentRect = checkDr;
		// GameActivity.currentRect.setType(5);
		father.doCheck();
		GameActivity.gameView.invalidate();
	}
}
